package com.qq.open.qzone.photo;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.log4j.Logger;

import com.qq.open.common.OpenQqConstants;
import com.qq.open.common.OpenQqUtils;
import com.qq.open.common.json.JSONException;
import com.qq.open.common.json.JSONObject;
import com.qq.open.qzone.bean.param.QqUpdatePicParamBean;
import com.qq.open.qzone.bean.result.QqUpdatePicResultBean;

/**
 * 登录用户上传照片，支持单张上传和批量上传。
 * 
 * @author HaoLiang
 * @version 0.1.1
 */
public class QqUpdatePic {
	
	/** QQ互联工具类 */
	private OpenQqUtils oqu = new OpenQqUtils();
	
	/** 日志 */
	private Logger log = Logger.getLogger(QqUpdatePic.class);
	
	
	/**
	 * 登录用户上传照片 - 单张上传
	 * 
	 * @param paramBean 参数
	 * @return 返回结果
	 * @throws IOException 
	 * @throws JSONException 
	 */
	public QqUpdatePicResultBean updateOnePic(QqUpdatePicParamBean paramBean) throws IOException, JSONException {
		
		// 日志
		log.info("登录用户上传照片 - 单张上传 开始...");
		
		// 请求接口并接收返回的数据
		String jsonData = oqu.doPost(OpenQqConstants.QQ_UPDATE_PIC_URL, this.getUpdatePicParam(paramBean));
		
		// 返回结果
		QqUpdatePicResultBean resultBean = this.jsonToBean(jsonData);
		
		// 日志
		log.info("登录用户上传照片 - 单张上传 开始...");
		
		return resultBean;
	}
	
	/**
	 * 登录用户上传照片 - 批量上传
	 * 
	 * @param paramBean 参数
	 * @return 接口返回信息
	 * @throws IOException 
	 * @throws JSONException 
	 */
	public List<QqUpdatePicResultBean> updateMorePic(List<QqUpdatePicParamBean> paramBeanList) throws IOException, JSONException {
		
		// 日志
		log.info("登录用户上传照片 - 批量上传 开始...");
		
		// 接口返回信心
		List<QqUpdatePicResultBean> resultBeanList = new ArrayList<QqUpdatePicResultBean>();
		
		// 批量上传照片的总张数
		int picNum = paramBeanList.size();
		
		// 循环上传照片
		for (int i = 0; i < paramBeanList.size(); i++) {
			// 日志
			log.info("共" + paramBeanList.size() + "张照片，当前第" + (i+1));
			// 获取一张照片的信息
			QqUpdatePicParamBean paramBean = paramBeanList.get(i);
			// 设置批量上传照片时，已成功上传的张数
			paramBean.setSuccessNum(i);
			// 批量上传照片的总张数
			paramBean.setPicNum(picNum);
			// 请求接口上传照片
			String jsonData = oqu.doPost(OpenQqConstants.QQ_UPDATE_PIC_URL, this.getUpdatePicParam(paramBean));
			// 接受接口返回的数据
			resultBeanList.add(this.jsonToBean(jsonData));
		}
		
		// 日志
		log.info("登录用户上传照片 - 批量上传 结束...");
		
		return resultBeanList;
	} 
	
	
	/**
	 * 获取上传图片的参数
	 * 
	 * @param paramBean 参数Bean
	 * @return 参数
	 * @throws UnsupportedEncodingException 
	 * @throws Exception 
	 */
	private MultipartEntity getUpdatePicParam(QqUpdatePicParamBean paramBean) throws UnsupportedEncodingException {
		MultipartEntity reqEntity = new MultipartEntity();
		
		// AccessToken
	    reqEntity.addPart("access_token", new StringBody(paramBean.getAccessToken()));
	    
	    // AppId
	    reqEntity.addPart("oauth_consumer_key", new StringBody(oqu.getConfigValue("qq.appid")));
	    
	    // OpenId
	    reqEntity.addPart("openid", new StringBody(paramBean.getOpenId()));
		
	    // 照片描述
		if (oqu.isNotNull(paramBean.getPhotoDesc())) {
			reqEntity.addPart("photodesc", new StringBody(paramBean.getPhotoDesc(),Charset.forName("UTF-8")));
		}

		// 照片的命名
		if (oqu.isNotNull(paramBean.getTitle())) {
			reqEntity.addPart("title", new StringBody(paramBean.getTitle(),Charset.forName("UTF-8")));
		}
		
		// 相册id
		if (oqu.isNotNull(paramBean.getAlbumId())) {
			reqEntity.addPart("albumid", new StringBody(paramBean.getAlbumId()));
		}
		
		// 照片拍摄时的地理位置的经度
		if (oqu.isNotNull(paramBean.getLongitude())) {
			reqEntity.addPart("x", new StringBody(paramBean.getLongitude()));
		}
		
		// 照片拍摄时的地理位置的纬度
		if (oqu.isNotNull(paramBean.getLatitude())) {
			reqEntity.addPart("y", new StringBody(paramBean.getLatitude()));
		}
		
		// 定义API返回的数据格式
		reqEntity.addPart("format", new StringBody("json"));
		
		// 标识上传照片时是否要发feed
		reqEntity.addPart("needfeed", new StringBody(String.valueOf(paramBean.getNeedFeed())));
		
		// 已成功上传的张数
		if (paramBean.getSuccessNum() > 0) {
			reqEntity.addPart("successnum", new StringBody(String.valueOf(paramBean.getSuccessNum())));
		}
		
		// 批量上传照片的总张数
		if (paramBean.getPicNum() > 0) {
			reqEntity.addPart("picnum", new StringBody(String.valueOf(paramBean.getPicNum())));
		}
		
		// 图片的内容
		FileBody fileBody = new FileBody(new File(paramBean.getPicPath()));
		reqEntity.addPart("picture", fileBody);
		
		return reqEntity;
	}
	
	
	
	/**
	 * 获取上传照片后的接口返回的数据
	 *    把返回的数据封装到Bean
	 * 
	 * @param jsonData 接口返回的数据
	 * @return 照片上传返回Bean
	 * @throws JSONException 
	 */
	private QqUpdatePicResultBean jsonToBean(String jsonData) throws JSONException {
		QqUpdatePicResultBean resultBean = new QqUpdatePicResultBean();
		
		// 接口返回的数据json
		JSONObject jsonObjRoot;
		try {
			jsonObjRoot = new JSONObject(jsonData);
		
			// 接口返回错误的场合
			if (jsonObjRoot.getInt("ret") != 0) {
				// 设置错误标识为真
				resultBean.setErrorFlg(true);
				
				// 设置错误编号
				resultBean.setErrorCode(jsonObjRoot.get("ret").toString());
				
				// 设置错误信息
				resultBean.setErrorMes(jsonObjRoot.getString("msg"));
			} else {
				// 相册ID
				resultBean.setAlbumId(jsonObjRoot.get("albumid").toString());
				
				// 大图ID
				resultBean.setLloc(jsonObjRoot.get("lloc").toString());
				
				// 小图ID
				resultBean.setSloc(jsonObjRoot.get("sloc").toString());
				
				// 大图地址
				resultBean.setLargeUrl(jsonObjRoot.getString("large_url"));
				
				// 小图地址
				resultBean.setSmallUrl(jsonObjRoot.getString("small_url"));
				
				// 图片高（单位：像素）
				resultBean.setHeight(jsonObjRoot.get("height").toString());
				
				// 图片宽（单位：像素）
				resultBean.setWidth(jsonObjRoot.get("width").toString());
			}
		} catch (JSONException e) {
			e.printStackTrace();
			// 日志
			log.error("updatePic 异常，json数据是：" + jsonData);
			throw e;
		}
		
		return resultBean;
	}
}
